<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 判断是不是基本数据类型
        function isFre(s) {
            let type = typeof (s)
            return type === 'string' || type === 'number' || type === 'boolean'
        }
        function Loose(objA, objB) {
            // 如果两个引用指向的是同一块内存地址,显然是相等的集合
            if (objA === objB) return true
            let _toString = Object.prototype.toString
            // 类型相同进行下一步的判断
            if (_toString.call(objB) === _toString.call(objA)) {
                if (Array.isArray(objA)) {
                    // 如果是数组
                    if (objA.length !== objB.length) {
                        return false
                    } else {
                        // every函数中传入断言函数,如果所有断言函数都返回真,执行结果就返回真,否者返回false
                        return objA.every((val, index) => {
                            return Loose(val, objB[index])
                        })
                    }
                } else if (_toString.call(objA) === '[object Object]') {
                    // 如果是对象
                    let keysA = Object.keys(objA)
                    let keysB = Object.keys(objB)
                    // 属性个数不同肯定不相等
                    if (keysA.length !== keysB.length) {
                        return false
                    } else {
                       return keysA.every((key)=>Loose(objA[key],objB[key]))
                    }
                } else if (isFre(objA)) {
                    // 如果是常见数据类型,string,number,boolen
                    return objA === objB
                } else {
                    //其他数据类型暂未处理
                    console.log('当前数据类型尚未处理', typeof (objA))
                }
            } else {
                // 数据类型不同返回false
                return false
            }
        }

        let obj1 = {
            name:'feifei',
            age:[21,10,{age1:12}],
            class:{
                math:[100,99],
                eng:[100,99]
            }
        }
        let obj2 = {
            name :'feifei',
            age:[21,10,{age1:12}],
            class:{
                math:[100,99],
                eng:[100,99]
            }
        }
        console.log(Loose(obj1,obj2))
    </script>
</body>

</html>